/**
 * 登录守卫工具类
 * 提供统一的登录状态检查和页面守卫功能
 */

const apiService = require('./apiService.js');

class AuthGuard {
  constructor() {
    this.loginRequiredPages = [
      '/pages/profile/profile',
      '/pages/orders/orders',
      '/pages/menu-management/menu-management'
    ];
    
    this.loginOptionalPages = [
      '/pages/index/index',
      '/pages/order/order'
    ];
  }

  /**
   * 检查页面是否需要登录
   * @param {string} pagePath 页面路径
   * @returns {boolean} 是否需要登录
   */
  isLoginRequired(pagePath) {
    return this.loginRequiredPages.some(path => pagePath.includes(path));
  }

  /**
   * 检查页面是否可选登录
   * @param {string} pagePath 页面路径
   * @returns {boolean} 是否可选登录
   */
  isLoginOptional(pagePath) {
    return this.loginOptionalPages.some(path => pagePath.includes(path));
  }

  /**
   * 页面登录守卫
   * @param {string} pagePath 页面路径
   * @param {Object} options 选项
   * @returns {boolean} 是否通过守卫
   */
  guardPage(pagePath, options = {}) {
    const {
      redirectTo = '/pages/login/login',
      showToast = true,
      toastTitle = '请先登录',
      silent = false
    } = options;

    // 检查当前登录状态
    const isLoggedIn = this.checkLoginStatus();
    
    // 如果页面需要登录但用户未登录
    if (this.isLoginRequired(pagePath) && !isLoggedIn) {
      if (!silent) {
        if (showToast) {
          wx.showToast({
            title: toastTitle,
            icon: 'none',
            duration: 1500
          });
        }
        
        setTimeout(() => {
          wx.reLaunch({
            url: redirectTo
          });
        }, showToast ? 1500 : 0);
      }
      
      return false;
    }

    return true;
  }

  /**
   * 检查登录状态
   * @returns {boolean} 是否已登录
   */
  checkLoginStatus() {
    const token = apiService.getToken();
    const userInfo = wx.getStorageSync('userInfo');
    
    const isLoggedIn = !!(token && userInfo);
    
    // 更新全局登录状态
    const app = getApp();
    if (app) {
      app.globalData.isLoggedIn = isLoggedIn;
      app.globalData.userInfo = isLoggedIn ? userInfo : null;
    }
    
    return isLoggedIn;
  }

  /**
   * 页面加载时的登录检查
   * @param {string} pagePath 页面路径
   * @param {Object} options 选项
   */
  onPageLoad(pagePath, options = {}) {
    return this.guardPage(pagePath, options);
  }

  /**
   * 页面显示时的登录检查
   * @param {string} pagePath 页面路径
   * @param {Object} options 选项
   */
  onPageShow(pagePath, options = {}) {
    // 重新检查登录状态
    this.checkLoginStatus();
    return this.guardPage(pagePath, options);
  }

  /**
   * API调用前的登录检查
   * @param {Object} options 选项
   * @returns {boolean} 是否通过检查
   */
  beforeApiCall(options = {}) {
    const {
      showToast = true,
      toastTitle = '请先登录'
    } = options;

    if (!this.checkLoginStatus()) {
      if (showToast) {
        wx.showToast({
          title: toastTitle,
          icon: 'none',
          duration: 1500
        });
      }
      
      setTimeout(() => {
        wx.reLaunch({
          url: '/pages/login/login'
        });
      }, showToast ? 1500 : 0);
      
      return false;
    }
    
    return true;
  }

  /**
   * 获取当前用户信息
   * @returns {Object|null} 用户信息
   */
  getCurrentUser() {
    if (this.checkLoginStatus()) {
      const app = getApp();
      return app ? app.globalData.userInfo : wx.getStorageSync('userInfo');
    }
    return null;
  }

  /**
   * 退出登录
   */
  logout() {
    // 清除API服务中的认证信息
    apiService.clearAuth();
    
    // 清除所有本地存储数据
    const app = getApp();
    if (app) {
      app.clearAllLocalData();
    }
    
    // 清除登录相关数据
    wx.removeStorageSync('token');
    wx.removeStorageSync('userInfo');
    
    // 更新全局状态
    if (app) {
      app.globalData.isLoggedIn = false;
      app.globalData.userInfo = null;
      app.globalData.currentRoom = null;
      app.globalData.isGuestMode = false;
    }
    
    // 跳转到登录页面
    wx.reLaunch({
      url: '/pages/login/login'
    });
  }
}

// 创建单例实例
const authGuard = new AuthGuard();

module.exports = authGuard;
